package cn.wolfcode.exception;

import cn.wolfcode.qo.JsonResult;
import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//贴上该注解标识该类对控制器进行了增强
@ControllerAdvice
public class MyControllerAdvice {

    /*贴了就是表示用于处理某种异常*/
    @ExceptionHandler(RuntimeException.class)
    public String handler(RuntimeException e, HttpServletResponse response, HandlerMethod method) {
        e.printStackTrace();//打印异常信息,方便找bug

        //需要根据前端请求的范式来响应不同的结果
        //如果是原本要返回视图的就可以返回error页面
        //如果原本要返回JsonResult现在也要返回JsonResult

        //判断这个方法是否是贴了@ResponseBody注解的
        //也就是说如果 没有 贴@ResponseBody的方法 出现了异常都会跳转到error页面
        if (!method.hasMethodAnnotation(ResponseBody.class)) {
            return "common/error";
        } else {
            //如果贴的话就跳出提示框 显示系统异常
            JsonResult jsonResult = new JsonResult(false, "系统异常,请联系管理员");
            //因为响应过去会乱码 所以要设置格式
            try {
                response.setContentType("application/json;charset=UTF-8");
                response.getWriter().println(JSON.toJSONString(jsonResult));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            return null;
        }

    }
    //修改后所有方法就不用try catch了 因为控制器的方法都被上面获取判断了
    //但是这样子无论是用户自己操作出现的异常 还是 我们自己系统的异常 都只能出现  系统异常,请联系管理员
    //如何解决 就先自定义一个异常类 继承RuntimeException
    //1.调用本身的构造器 把自己的msg传给父类
    //2.把之前 抛出RuntimeException(自定义信息)全改成自定义异常
    //3.在ControllerAdvice类配置的自定义异常处理

    //专门处理 LoginException 自定义异常类的异常
    @ExceptionHandler(LoginException.class)
    @ResponseBody
    public JsonResult handler1(LoginException e) {
        //通过LoginException的对象来获取 自定义的异常信息
        return new JsonResult(false, e.getMessage());
    }
}
